{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pregnants</th>\n",
       "      <th>Plasma_glucose_concentration</th>\n",
       "      <th>blood_pressure</th>\n",
       "      <th>Triceps_skin_fold_thickness</th>\n",
       "      <th>serum_insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>Diabetes_pedigree_function</th>\n",
       "      <th>Age</th>\n",
       "      <th>Target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.639947</td>\n",
       "      <td>0.866045</td>\n",
       "      <td>-0.031990</td>\n",
       "      <td>0.670643</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>0.166619</td>\n",
       "      <td>0.468492</td>\n",
       "      <td>1.425995</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.844885</td>\n",
       "      <td>-1.205066</td>\n",
       "      <td>-0.528319</td>\n",
       "      <td>-0.012301</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>-0.852200</td>\n",
       "      <td>-0.365061</td>\n",
       "      <td>-0.190672</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.233880</td>\n",
       "      <td>2.016662</td>\n",
       "      <td>-0.693761</td>\n",
       "      <td>-0.012301</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>-1.332500</td>\n",
       "      <td>0.604397</td>\n",
       "      <td>-0.105584</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.844885</td>\n",
       "      <td>-1.073567</td>\n",
       "      <td>-0.528319</td>\n",
       "      <td>-0.695245</td>\n",
       "      <td>-0.540642</td>\n",
       "      <td>-0.633881</td>\n",
       "      <td>-0.920763</td>\n",
       "      <td>-1.041549</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.141852</td>\n",
       "      <td>0.504422</td>\n",
       "      <td>-2.679076</td>\n",
       "      <td>0.670643</td>\n",
       "      <td>0.316566</td>\n",
       "      <td>1.549303</td>\n",
       "      <td>5.484909</td>\n",
       "      <td>-0.020496</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   pregnants  Plasma_glucose_concentration  blood_pressure  \\\n",
       "0   0.639947                      0.866045       -0.031990   \n",
       "1  -0.844885                     -1.205066       -0.528319   \n",
       "2   1.233880                      2.016662       -0.693761   \n",
       "3  -0.844885                     -1.073567       -0.528319   \n",
       "4  -1.141852                      0.504422       -2.679076   \n",
       "\n",
       "   Triceps_skin_fold_thickness  serum_insulin       BMI  \\\n",
       "0                     0.670643      -0.181541  0.166619   \n",
       "1                    -0.012301      -0.181541 -0.852200   \n",
       "2                    -0.012301      -0.181541 -1.332500   \n",
       "3                    -0.695245      -0.540642 -0.633881   \n",
       "4                     0.670643       0.316566  1.549303   \n",
       "\n",
       "   Diabetes_pedigree_function       Age  Target  \n",
       "0                    0.468492  1.425995       1  \n",
       "1                   -0.365061 -0.190672       0  \n",
       "2                    0.604397 -0.105584       1  \n",
       "3                   -0.920763 -1.041549       0  \n",
       "4                    5.484909 -0.020496       1  "
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "#input data\n",
    "train = pd.read_csv(\"~/Documents/Diabetes/FE_pima-indians-diabetes.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pregnants</th>\n",
       "      <th>Plasma_glucose_concentration</th>\n",
       "      <th>blood_pressure</th>\n",
       "      <th>Triceps_skin_fold_thickness</th>\n",
       "      <th>serum_insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>Diabetes_pedigree_function</th>\n",
       "      <th>Age</th>\n",
       "      <th>Target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>7.680000e+02</td>\n",
       "      <td>7.680000e+02</td>\n",
       "      <td>7.680000e+02</td>\n",
       "      <td>7.680000e+02</td>\n",
       "      <td>7.680000e+02</td>\n",
       "      <td>7.680000e+02</td>\n",
       "      <td>7.680000e+02</td>\n",
       "      <td>7.680000e+02</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>2.544261e-17</td>\n",
       "      <td>1.474515e-17</td>\n",
       "      <td>-3.321273e-17</td>\n",
       "      <td>-1.888680e-16</td>\n",
       "      <td>2.941802e-17</td>\n",
       "      <td>2.815312e-16</td>\n",
       "      <td>2.422108e-16</td>\n",
       "      <td>1.528002e-16</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>1.000652e+00</td>\n",
       "      <td>1.000652e+00</td>\n",
       "      <td>1.000652e+00</td>\n",
       "      <td>1.000652e+00</td>\n",
       "      <td>1.000652e+00</td>\n",
       "      <td>1.000652e+00</td>\n",
       "      <td>1.000652e+00</td>\n",
       "      <td>1.000652e+00</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>-1.141852e+00</td>\n",
       "      <td>-2.552931e+00</td>\n",
       "      <td>-4.002619e+00</td>\n",
       "      <td>-2.516429e+00</td>\n",
       "      <td>-1.467353e+00</td>\n",
       "      <td>-2.074783e+00</td>\n",
       "      <td>-1.189553e+00</td>\n",
       "      <td>-1.041549e+00</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>-8.448851e-01</td>\n",
       "      <td>-7.201630e-01</td>\n",
       "      <td>-6.937615e-01</td>\n",
       "      <td>-4.675972e-01</td>\n",
       "      <td>-2.220849e-01</td>\n",
       "      <td>-7.212087e-01</td>\n",
       "      <td>-6.889685e-01</td>\n",
       "      <td>-7.862862e-01</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>-2.509521e-01</td>\n",
       "      <td>-1.530732e-01</td>\n",
       "      <td>-3.198993e-02</td>\n",
       "      <td>-1.230129e-02</td>\n",
       "      <td>-1.815412e-01</td>\n",
       "      <td>-2.258989e-02</td>\n",
       "      <td>-3.001282e-01</td>\n",
       "      <td>-3.608474e-01</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.399473e-01</td>\n",
       "      <td>6.112653e-01</td>\n",
       "      <td>6.297816e-01</td>\n",
       "      <td>3.291706e-01</td>\n",
       "      <td>-1.554775e-01</td>\n",
       "      <td>6.032562e-01</td>\n",
       "      <td>4.662269e-01</td>\n",
       "      <td>6.602056e-01</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>3.906578e+00</td>\n",
       "      <td>2.542658e+00</td>\n",
       "      <td>4.104082e+00</td>\n",
       "      <td>7.955377e+00</td>\n",
       "      <td>8.170442e+00</td>\n",
       "      <td>5.042397e+00</td>\n",
       "      <td>5.883565e+00</td>\n",
       "      <td>4.063716e+00</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          pregnants  Plasma_glucose_concentration  blood_pressure  \\\n",
       "count  7.680000e+02                  7.680000e+02    7.680000e+02   \n",
       "mean   2.544261e-17                  1.474515e-17   -3.321273e-17   \n",
       "std    1.000652e+00                  1.000652e+00    1.000652e+00   \n",
       "min   -1.141852e+00                 -2.552931e+00   -4.002619e+00   \n",
       "25%   -8.448851e-01                 -7.201630e-01   -6.937615e-01   \n",
       "50%   -2.509521e-01                 -1.530732e-01   -3.198993e-02   \n",
       "75%    6.399473e-01                  6.112653e-01    6.297816e-01   \n",
       "max    3.906578e+00                  2.542658e+00    4.104082e+00   \n",
       "\n",
       "       Triceps_skin_fold_thickness  serum_insulin           BMI  \\\n",
       "count                 7.680000e+02   7.680000e+02  7.680000e+02   \n",
       "mean                 -1.888680e-16   2.941802e-17  2.815312e-16   \n",
       "std                   1.000652e+00   1.000652e+00  1.000652e+00   \n",
       "min                  -2.516429e+00  -1.467353e+00 -2.074783e+00   \n",
       "25%                  -4.675972e-01  -2.220849e-01 -7.212087e-01   \n",
       "50%                  -1.230129e-02  -1.815412e-01 -2.258989e-02   \n",
       "75%                   3.291706e-01  -1.554775e-01  6.032562e-01   \n",
       "max                   7.955377e+00   8.170442e+00  5.042397e+00   \n",
       "\n",
       "       Diabetes_pedigree_function           Age      Target  \n",
       "count                7.680000e+02  7.680000e+02  768.000000  \n",
       "mean                 2.422108e-16  1.528002e-16    0.348958  \n",
       "std                  1.000652e+00  1.000652e+00    0.476951  \n",
       "min                 -1.189553e+00 -1.041549e+00    0.000000  \n",
       "25%                 -6.889685e-01 -7.862862e-01    0.000000  \n",
       "50%                 -3.001282e-01 -3.608474e-01    0.000000  \n",
       "75%                  4.662269e-01  6.602056e-01    1.000000  \n",
       "max                  5.883565e+00  4.063716e+00    1.000000  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train = train['Target']\n",
    "X_train = train.drop([\"Target\"], axis = 1)\n",
    "\n",
    "feat_name = X_train.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "penalties = ['l1','l2']\n",
    "Cs = np.logspace(-4, 4, 9)\n",
    "tuned_parameters = dict(penalty = penalties, C = Cs)\n",
    "lr = LogisticRegression(solver = 'liblinear')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 以正确率作为评价指标进行5折交叉验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': array([1.e-04, 1.e-03, 1.e-02, 1.e-01, 1.e+00, 1.e+01, 1.e+02, 1.e+03,\n",
       "       1.e+04])},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='accuracy', verbose=0)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid_accuracy = GridSearchCV(lr, tuned_parameters, cv = 5, scoring = 'accuracy')\n",
    "grid_accuracy.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7747395833333334\n",
      "{'C': 0.1, 'penalty': 'l2'}\n"
     ]
    }
   ],
   "source": [
    "print(grid_accuracy.best_score_)\n",
    "print(grid_accuracy.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_means = grid_accuracy.cv_results_['mean_test_score']\n",
    "test_stds = grid_accuracy.cv_results_['std_test_score']\n",
    "train_means = grid_accuracy.cv_results_['mean_train_score']\n",
    "train_stds = grid_accuracy.cv_results_['std_train_score']\n",
    "\n",
    "n_Cs = len(Cs)\n",
    "n_penalties = len(penalties)\n",
    "test_scores = np.array(test_means).reshape(n_Cs, n_penalties)\n",
    "train_scores = np.array(train_means).reshape(n_Cs, n_penalties)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs, n_penalties)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs, n_penalties)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penalties):\n",
    "    plt.errorbar(x_axis, test_scores[:, i], yerr=test_stds[:, i], label = penalties[i] + ' Test')\n",
    "    plt.errorbar(x_axis, train_scores[:, i], yerr=train_stds[:, i], label = penalties[i] + ' Train')\n",
    "\n",
    "plt.legend()\n",
    "plt.xlabel('log(C)')\n",
    "plt.ylabel('accuracy')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 以log似然损失作为评价指标进行5折交叉验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': array([1.e-04, 1.e-03, 1.e-02, 1.e-01, 1.e+00, 1.e+01, 1.e+02, 1.e+03,\n",
       "       1.e+04])},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid_logloss = GridSearchCV(lr, tuned_parameters, cv = 5, scoring = 'neg_log_loss')\n",
    "grid_logloss.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.4760242257932295\n",
      "{'C': 1.0, 'penalty': 'l1'}\n"
     ]
    }
   ],
   "source": [
    "print(-grid_logloss.best_score_)\n",
    "print(grid_logloss.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_means = grid_logloss.cv_results_['mean_test_score']\n",
    "test_stds = grid_logloss.cv_results_['std_test_score']\n",
    "train_means = grid_logloss.cv_results_['mean_train_score']\n",
    "train_stds = grid_logloss.cv_results_['std_train_score']\n",
    "\n",
    "n_Cs = len(Cs)\n",
    "n_penalties = len(penalties)\n",
    "test_scores = np.array(test_means).reshape(n_Cs, n_penalties)\n",
    "train_scores = np.array(train_means).reshape(n_Cs, n_penalties)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs, n_penalties)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs, n_penalties)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penalties):\n",
    "    plt.errorbar(x_axis, -test_scores[:, i], yerr=test_stds[:, i], label = penalties[i] + ' Test')\n",
    "    plt.errorbar(x_axis, -train_scores[:, i], yerr=train_stds[:, i], label = penalties[i] + ' Train')\n",
    "\n",
    "plt.legend()\n",
    "plt.xlabel('log(C)')\n",
    "plt.ylabel('logloss')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 预测结果与实际结果比较"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "real_result, accuracy_result, logloss_result = y_train, pd.Series(grid_accuracy.best_estimator_.predict(X_train)), pd.Series(grid_logloss.best_estimator_.predict(X_train))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>real</th>\n",
       "      <th>model_acc</th>\n",
       "      <th>model_log</th>\n",
       "      <th>model_acc_true</th>\n",
       "      <th>model_log_true</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   real  model_acc  model_log  model_acc_true  model_log_true\n",
       "0     1          1          1               1               1\n",
       "1     0          0          0               1               1\n",
       "2     1          1          1               1               1\n",
       "3     0          0          0               1               1\n",
       "4     1          1          1               1               1"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results = pd.concat([real_result, accuracy_result, logloss_result], axis=1)\n",
    "results.columns = ['real','model_acc', 'model_log']\n",
    "results['model_acc_true'] = np.where(results['real'] == results['model_acc'], 1, 0)\n",
    "results['model_log_true'] = np.where(results['real'] == results['model_log'], 1, 0)\n",
    "results.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "593"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results['model_acc_true'].sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "595"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results['model_log_true'].sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7721354166666666 0.7747395833333334\n"
     ]
    }
   ],
   "source": [
    "print(593/768,595/768)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 结论"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "就正确率来说两个模型都约为77%， log似然损失模型稍优于正确率模型"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
